package com.dc.java8._1_lambda.checkexception;

import java.util.Objects;
import java.util.function.Function;

/**
 * Description: 函数式接口受检查异常处理 包装类
 * 主要是对 传入的 函数式接口，在业务处理中，针对出现的异常，进行处理
 *
 * https://juejin.im/post/5db05425e51d452a23782929
 *
 * @author: gdc
 * @date: 2021/6/4
 * @version 1.0
 */
public interface Attempt {

    /**
     * 处理函数时接口，并处理异常
     * 将受检查异常，转换为不受检查异常
     * @param function         函数式接口
     * @param <T>               传参类型
     * @param <R>               返回类型
     * @return                  返回结果
     */
    static <T, R> Function<T, R> apply(CheckedFunction<T, R> function) {
        Objects.requireNonNull(function);
        return t -> {
            try {
                return function.apply(t);
            } catch (Throwable throwable) {
                throw new RuntimeException();
            }
        };
    }

    /**
     * 处理函数时接口，并处理异常，同时需要添加异常处理方式（推荐使用此方法）
     * 将受检查异常，转换为不受检查异常
     * @param function          函数式接口
     * @param <T>               传参类型
     * @param <R>               返回类型
     * @return                  返回结果
     */
    static <T, R> Function<T, R> apply(CheckedFunction<T, R> function, Function<Throwable, R> handler) {
        Objects.requireNonNull(function);
        Objects.requireNonNull(handler);

        return t -> {
            try {
                return function.apply(t);
            } catch (Throwable e) {
                return handler.apply(e);
            }
        };
    }


}
